using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace EntityKit.Runtime
{
    /// <summary>
    /// 字符串处理工具类，用于处理参数化文本和富文本格式
    /// </summary>
    public static class StringHelper
    {
        /// <summary>
        /// 使用提供的参数字典格式化文本
        /// 支持格式如"欢迎{playerName}来到{gameName}世界"
        /// </summary>
        /// <param name="template">文本模板</param>
        /// <param name="parameters">参数字典</param>
        /// <returns>格式化后的文本</returns>
        public static string Format(string template, Dictionary<string, object> parameters)
        {
            if (string.IsNullOrEmpty(template) || parameters == null)
                return template;

            // 使用正则表达式查找并替换 {parameterName} 格式的占位符
            return Regex.Replace(template, @"\{(\w+)\}", match =>
            {
                string key = match.Groups[1].Value;
                return parameters.ContainsKey(key) ? parameters[key].ToString() : match.Value;
            });
        }

        /// <summary>
        /// 使用提供的参数格式化文本
        /// 支持格式如"欢迎{0}来到{1}世界"
        /// </summary>
        /// <param name="template">文本模板</param>
        /// <param name="args">参数数组</param>
        /// <returns>格式化后的文本</returns>
        public static string Format(string template, params object[] args)
        {
            if (string.IsNullOrEmpty(template) || args == null)
                return template;

            // 直接使用string.Format处理序号占位符
            return string.Format(template, args);
        }

        /// <summary>
        /// 为文本添加颜色标签
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <param name="color">颜色，可以是颜色名称(red, blue等)或十六进制颜色值(#FF0000)</param>
        /// <returns>带颜色标签的文本</returns>
        public static string Color(string text, string color)
        {
            return $"<color={color}>{text}</color>";
        }

        /// <summary>
        /// 为文本添加大小标签
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <param name="size">字体大小</param>
        /// <returns>带大小标签的文本</returns>
        public static string Size(string text, int size)
        {
            return $"<size={size}>{text}</size>";
        }

        /// <summary>
        /// 为文本添加粗体标签
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>带粗体标签的文本</returns>
        public static string Bold(string text)
        {
            return $"<b>{text}</b>";
        }

        /// <summary>
        /// 为文本添加斜体标签
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>带斜体标签的文本</returns>
        public static string Italic(string text)
        {
            return $"<i>{text}</i>";
        }

        /// <summary>
        /// 为文本添加下划线标签
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>带下划线标签的文本</returns>
        public static string Underline(string text)
        {
            return $"<u>{text}</u>";
        }

        /// <summary>
        /// 统一格式化文本，处理换行符、制表符等特殊字符
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>格式化后的文本</returns>
        public static string FormatText(this string text)
        {
            if (string.IsNullOrEmpty(text))
                return text;

            // 处理各种换行符
            text = text.Replace("\\r\\n", "\n"); // Windows换行符
            text = text.Replace("\\n", "\n"); // Unix换行符
            text = text.Replace("\\r", "\n"); // Mac换行符
            text = text.Replace("\r\n", "\n"); // Windows实际换行符
            text = text.Replace("\r", "\n"); // Mac实际换行符

            // 处理制表符
            text = text.Replace("\\t", "\t");

            // 处理常见的转义字符
            text = text.Replace("\\\"", "\""); // 双引号
            text = text.Replace("\\'", "'"); // 单引号
            text = text.Replace("\\\\", "\\"); // 反斜杠

            // 处理空格转义字符
            text = text.Replace("\\s", " "); // 空格

            return text;
        }

        /// <summary>
        /// 仅处理换行符
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>处理换行符后的文本</returns>
        public static string FormatNewLines(this string text)
        {
            if (string.IsNullOrEmpty(text))
                return text;

            // 处理各种换行符
            text = text.Replace("\\r\\n", "\n"); // 将Windows换行符转义形式替换为\n
            text = text.Replace("\\n", "\n"); // 将\n转义形式替换为实际换行符
            text = text.Replace("\\r", "\n"); // 将Mac换行符转义形式替换为\n
            text = text.Replace("\r\n", "\n"); // 将Windows实际换行符替换为\n
            text = text.Replace("\r", "\n"); // 将Mac实际换行符替换为\n

            return text;
        }

        /// <summary>
        /// 确保文本使用统一的Unicode格式
        /// </summary>
        /// <param name="text">原始文本</param>
        /// <returns>Unicode标准化后的文本</returns>
        public static string NormalizeUnicode(this string text)
        {
            if (string.IsNullOrEmpty(text))
                return text;

            // 使用Unity的内置方法确保文本使用统一的Unicode格式
            return text.Normalize();
        }

        /// <summary>
        /// 首字母大写
        /// </summary>
        public static string Capitalize(this string str)
        {
            if (string.IsNullOrEmpty(str))
                return str;
            return char.ToUpper(str[0]) + str.Substring(1);
        }
    }
}